package com.hspedu.innerClass.category;

/**
 * 局部内部类
 * 定义在外部类的局部位置，比如方法中，并且有类名
 * 1.可以直接访问外部类的所有成员，包含私有的
 * 2.不能添加访问修饰符，因为它的地位就是一个局部变量。
 *   局部变量是不能使用修饰符的。但是可以使用final修饰，
 *   因为局部变量也可以使用final
 * 3.作用域：仅仅在定义它的方法或代码块中。
 * 4.局部内部类 访问 外部类的成员 可以直接访问
 * 5.外部类 访问 局部内部类的成员 要先创建对象，再访问（必须在作用域内）
 * 6.外部其他类 不能访问 局部内部类（因为局部内部类是一个局部变量）
 * 7.如果外部类和局部内部类的成员重名时，默认遵循就近原则，
 *   如果想访问外部的成员，则可以使用 (外部类名.this.从成员) 去访问
 *   System.out.println("外部类的n2=" + 外部类名.this.n2);
 *
 */
public class LocalInnerClass {
    public static void main(String[] args) {
        Outer02 outer02 = new Outer02();
        outer02.m1();
        System.out.println("outer02的 hashcode = " + outer02);
        System.out.println("内部类里面调用的 Outer02.this 就是 outer02");
    }
}

class Outer02{//外部类
    private int n1 = 100;

    //私有方法
    private void m2(){
        System.out.println("Outer02 m2()");
    }

    public void m1(){
        //1.局部内部类是定义在外部类的局部位置，通常在方法中
        //2.不能添加访问修饰符，但是可以使用final修饰
        //4.作用域：仅仅在定义它的方法或代码块中
        final class Inner02{//局部内部类
            //可以直接访问外部类的的所有成员，包括私有的
            private int n1 = 800;
            public void f1(){
                //局部内部类可以直接访问外部类的成员，比如下面外部类 n1 和 m2()
                //如果外部类和局部内部类的成员重名时，默认遵循就近原则，
                //如果想访问外部类的成员，使用 (外部类名.this.成员) 访问
                System.out.println("n1 = " + n1 + "外部类的n1 = " +Outer02.this.n1);
                System.out.println("Outer02.this的 hashcode = " + Outer02.this);
                m2();
            }
        }

        //外部类在方法中可以传概念Inner02对象，然后调用方法
        Inner02 inner02 = new Inner02();
        inner02.f1();
    }

}